diff --git a/user_guide/nav/hacks.txt b/user_guide/nav/hacks.txt
index 183481b..8c17f00 100644
--- a/user_guide/nav/hacks.txt
+++ b/user_guide/nav/hacks.txt
@@ -1,6 +1,6 @@
 I did the following hack in moo.fx.js:
 
-At line 79 in the toggle: function() function, I added:
+At line 79 in the toggle: function()  function, I added:
 
 document.getElementById('nav').style.display = 'block';
 
diff --git a/user_guide/nav/moo.fx.js b/user_guide/nav/moo.fx.js
index b21ee20..256371d 100755
--- a/user_guide/nav/moo.fx.js
+++ b/user_guide/nav/moo.fx.js
@@ -25,8 +25,8 @@
 	},
 
 	step: function() {
-		var time = (new Date).getTime();
-		var Tpos  = (time - this.startTime) / (this.duration);
+		var time  = (new Date).getTime();
+		var Tpos   = (time - this.startTime) / (this.duration);
 		if (time >= this.duration+this.startTime) {
 			this.now = this.to;
 			clearInterval (this.timer);
diff --git a/user_guide/nav/prototype.lite.js b/user_guide/nav/prototype.lite.js
index 857faae..e6c3622 100755
--- a/user_guide/nav/prototype.lite.js
+++ b/user_guide/nav/prototype.lite.js
@@ -1,9 +1,9 @@
-/* Prototype JavaScript framework
- * (c) 2005 Sam Stephenson <sam@conio.net>
+/*  Prototype JavaScript framework
+ *  (c) 2005 Sam Stephenson <sam@conio.net>
  *
- * Prototype is freely distributable under the terms of an MIT-style license.
+ *  Prototype is freely distributable under the terms of an MIT-style license.
  *
- * For details, see the Prototype web site: http://prototype.conio.net/
+ *  For details, see the Prototype web site: http://prototype.conio.net/
  *
 /*--------------------------------------------------------------------------*/
 
@@ -11,117 +11,117 @@
 //note: this is a stripped down version of prototype, to be used with moo.fx by mad4milk (http://moofx.mad4milk.net).
 
 var Class = {
- create: function() {
+  create: function() {
 	return function() {
-	 this.initialize.apply(this, arguments);
+	  this.initialize.apply(this, arguments);
 	}
- }
+  }
 }
 
 Object.extend = function(destination, source) {
- for (property in source) {
+  for (property in source) {
 	destination[property] = source[property];
- }
- return destination;
+  }
+  return destination;
 }
 
 Function.prototype.bind = function(object) {
- var __method = this;
- return function() {
+  var __method = this;
+  return function() {
 	return __method.apply(object, arguments);
- }
+  }
 }
 
 function $() {
- var elements = new Array();
+  var elements = new Array();
 
- for (var i = 0; i < arguments.length; i++) {
+  for (var i = 0; i < arguments.length; i++) {
 	var element = arguments[i];
 	if (typeof element == 'string')
-	 element = document.getElementById(element);
+	  element = document.getElementById(element);
 
 	if (arguments.length == 1)
-	 return element;
+	  return element;
 
 	elements.push(element);
- }
+  }
 
- return elements;
+  return elements;
 }
 
 //-------------------------
 
 document.getElementsByClassName = function(className) {
- var children = document.getElementsByTagName('*') || document.all;
- var elements = new Array();
+  var children = document.getElementsByTagName('*') || document.all;
+  var elements = new Array();
 
- for (var i = 0; i < children.length; i++) {
+  for (var i = 0; i < children.length; i++) {
 	var child = children[i];
 	var classNames = child.className.split(' ');
 	for (var j = 0; j < classNames.length; j++) {
-	 if (classNames[j] == className) {
+	  if (classNames[j] == className) {
 		elements.push(child);
 		break;
-	 }
+	  }
 	}
- }
+  }
 
- return elements;
+  return elements;
 }
 
 //-------------------------
 
 if (!window.Element) {
- var Element = new Object();
+  var Element = new Object();
 }
 
 Object.extend(Element, {
- remove: function(element) {
+  remove: function(element) {
 	element = $(element);
 	element.parentNode.removeChild(element);
- },
+  },
 
- hasClassName: function(element, className) {
+  hasClassName: function(element, className) {
 	element = $(element);
 	if (!element)
-	 return;
+	  return;
 	var a = element.className.split(' ');
 	for (var i = 0; i < a.length; i++) {
-	 if (a[i] == className)
+	  if (a[i] == className)
 		return true;
 	}
 	return false;
- },
+  },
 
- addClassName: function(element, className) {
+  addClassName: function(element, className) {
 	element = $(element);
 	Element.removeClassName(element, className);
 	element.className += ' ' + className;
- },
+  },
 
- removeClassName: function(element, className) {
+  removeClassName: function(element, className) {
 	element = $(element);
 	if (!element)
-	 return;
+	  return;
 	var newClassName = '';
 	var a = element.className.split(' ');
 	for (var i = 0; i < a.length; i++) {
-	 if (a[i] != className) {
+	  if (a[i] != className) {
 		if (i > 0)
-		 newClassName += ' ';
+		  newClassName += ' ';
 		newClassName += a[i];
-	 }
+	  }
 	}
 	element.className = newClassName;
- },
+  },
 
- // removes whitespace-only text node children
- cleanWhitespace: function(element) {
+  // removes whitespace-only text node children
+  cleanWhitespace: function(element) {
 	element = $(element);
 	for (var i = 0; i < element.childNodes.length; i++) {
-	 var node = element.childNodes[i];
-	 if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+	  var node = element.childNodes[i];
+	  if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
 		Element.remove(node);
 	}
- }
+  }
 });
\ No newline at end of file
